//
// Created by QU on 24-6-21.
//

#include <iostream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <new>
#include <thread>
#include <algorithm>
#include <array>
#include <string>
#include <deque>

using std::cout, std::cin, std::endl;

int x = 1;         // 左值
int get_val() { return x; }
void set_val(int val) { x = val; }

int main()
{
    // x++和++x虽然都是自增操作，但是却分为不同的左右值。其中x++是右值，因为在后置++操作中编译器首先会生成
    // 一份x值的临时复制，然后才对x递增，最后返回临时复制内容。而++x则不同，它是直接对x递增后马上返回其自身，所以++x是一个左
    // 值。如果对它们实施取地址操作，就会发现++x的取地址操作可以编译成功，而对x++取地址则会报错。但是从直觉上来说，&x++看起来
    // 更像是会编译成功的一方：

    x++;
    ++x;
    // int *p = &x++;  // 编译失败
    // int *q = &++x;  // 编译成功
    int y = get_val();
    set_val(6);     // 6 是右值, 但是传入函数的val是左值

    auto char_ptr__ = &"hello aquuawius";         // 根据经验, 字面量6是右值(因为不能取地址),
    // 但是, 上面的仍然可以通过编译, ""字面量可以取地址, 故证明"hello"为左值.


}
